#include "graham.h"

Graham::Graham(Grupo g):ConvexHull(g){}

Point Graham::calcularBaricentro()
{
    Point baricentro(3);
    for (int i=0 ; i<grupo.get_pontos().size() ; i++)
        baricentro = baricentro + grupo.get_pontos().at(i);
    TIPO_ELEMENTO n = (TIPO_ELEMENTO)grupo.get_pontos().size();
    for (size_t i=0 ; i<baricentro.get_dimensao() ; i++)
        baricentro(i) /= n;
    return(baricentro);
}

Fecho Graham::convexhull()
{
    // Converter de "QList<Point>" para "QVector<Ponto>":
    QVector<Ponto> pontos;
    for (int i=0 ; i<grupo.get_pontos().size() ; i++)
    {
        // Converter de "Point" para "Ponto" e pôr no QVector:
        pontos.append(Ponto(grupo.get_pontos().at(i)(0),grupo.get_pontos().at(i)(1)));
    }

    QVector<Ponto> novoVetor(0);
    Ponto *gamb;
    vector<Ponto> pol = geraPolEstrelado(pontos);

    //reconverte pra QVect:
    for(vector<Ponto>::iterator it = pol.begin(); it != pol.end(); it++) {
        gamb = new Ponto((*it).x,(*it).y);
        gamb->setVal((*it).val);
        novoVetor.append(*gamb);
        delete gamb;

        /// Guardar os pontos do poligono estrelado:
        Point aux(2);
        aux(0) = (*it).x;
        aux(1) = (*it).y;
        poligonoEstrelado.append(aux);
    }

    pontos = novoVetor;

    int u;
    int h = 1;
    QVector<Ponto> fecho;
    fecho.append(pontos.at(0));
    fecho.append(pontos.at(1));

    //CALCULAR FECHO
    for(int i = 2; i < pontos.size()+1;i++) {
        u = i;
        if (i == pontos.size()) u = 0;
        while(h > 0 && prodVet(fecho.at(h-1),fecho.at(h),pontos.at(u)) > 0) {
            fecho.remove(h);
            h -= 1;
        }
        h += 1;
        fecho.append(pontos.at(u));
    }

    // Verificar se o ponto esta no fecho:
    QList<int> pontos_ids;
    for (int i=0 ; i<grupo.get_pontos().size() ; i++)
    {
        // Cria um "Point" auxiliar:
        Point aux(grupo.get_pontos().at(i));
        for (int j=0 ; j<fecho.size() ; j++)
            if (aux(0) == fecho.at(j).x && aux(1) == fecho.at(j).y)
                pontos_ids.append(i);
    }

    return(Fecho(grupo.get_nome(),pontos_ids));
}
